<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    var nameArr = ['q', 'w', 'e'];
    var hobby = {
        name: "hmh",
        age: 20
    };
    //判断是否是一个数组
    function isArray(param) {
        //1  Array.isArray(param)   //true | false
        //2  param instanceof Array //true | false
        //3  param.constructor == Array      //true | false
        //4  Object.prototype.toString.call(param) === '[object Array]'   //true | false

        /*
         *注意：
         *1.使用instaceof和construcor,被判断的array必须是在当前页面声明的！
         *比如，一个页面（父页面）有一个框架，框架中引用了一个页面（子页面），在子页面中声明了一个array，并将其赋值给父页面的一个变量，这时判断该变量，Array ==object.constructor;会返回false；
         *原因：
         *
         *1、array属于引用型数据，在传递过程中，仅仅是引用地址的传递。
         *2、每个页面的Array原生对象所引用的地址是不一样的，在子页面声明的array，所对应的构造函数，是子页面的Array对象；父页面来进行判断，使用的Array并不等于子页面的Array。
         */
        if (typeof param === 'object') {
            return Object.prototype.toString.call(param) === '[object Array]';
        }
        return false;
    }

    //判断是否是一个方法
    function isFunction(param) {
        if(typeof param == 'function') {
            return true;
        }
        return false;
    }

    /**********************************************************/
    /**
     * 值传递与引用传递
     *
     */
    //深度复制
    function cloneObject(param) {
        var tmp = JSON.parse(JSON.stringify(param));
        return tmp;
    }

    var srcObj = {
        a: 1,
        b: {
            b1: ["hello", "hi"],
            b2: "JavaScript"
        }
    };
    var abObj = srcObj;
    var tarObj = cloneObject(srcObj);

/*    srcObj.a = 2;
    srcObj.b.b1[0] = "Hello";

    console.log(abObj.a);           //2
    console.log(abObj.b.b1[0]);     //Hello

    console.log(tarObj.a);          // 1
    console.log(tarObj.b.b1[0]);    // "hello"*/

    /**********************************************************/
    // 对数组进行去重操作，只考虑数组中元素为数字或字符串，返回一个去重后的数组
    function deleteRepeatArr(param) {
        var tmp = JSON.parse(JSON.stringify(param));
        var result = new Array();
        for (var i = 0; i < tmp.length; i++) {
            for (var j = i + 1; j < tmp.length ; j++) {
                if (tmp[i] === tmp[j]) {
                    j = ++i;
                }
            }
            result.push(tmp[i]);
        }
        return result;
    }

    //递归算法
    var num  = [0]; //递归了多少次
    function deleteRepeatArr2(param, res) {
        var tmp = JSON.parse(JSON.stringify(param));
        var res = arguments[1] ? arguments[1] : [];//设置第一个参数的默认值为数组
        for (var i=0; i < tmp.length; i++){
            if(res.length == 0){
                res.push(tmp[i]);
                ++num[0];
                diff(tmp, res);
            }else{
                var flag = true;    //是否可以添加
                for(var j=0; j < res.length; j++){
                    if(tmp[i] === res[j]){
                        flag = false;
                        break;
                    }
                }
                if(flag == true){
                    res.push(tmp[i]);
                    ++num[0];
                    diff(tmp, res);
                }
            }
        }
        return res;
    }
    /*
    var arr1 = [4,2,15,3,4,2,1,9,5,1,9];
    var res1 = deleteRepeatArr(arr1);      //返回[15, 3, 4, 2, 5, 1, 9]
    var res2 = deleteRepeatArr2(arr1);    //返回[4, 2, 15, 3, 1, 9, 5]
    console.log(res1);
    console.log(res2);
    console.log(num);*/

    // 实现一个简单的trim函数，用于去除一个字符串，头部和尾部的空白字符
    // 假定空白字符只有半角空格、Tab
    function simpleTrim(str) {
        var len = str.length;
        if(len == 0){
            return '';
        }
        var res = new Array();
        //从头部判断
        for (var i = 0; i < len; i++){
            if(str[i] === ' '){
                res.push(i);
                if(str[i+1] !== ' '){
                    break;
                }
            }else{
                break;
            }
        }
        //从尾部判断
        if(len > res.length ){
            for (var i = len-1; i < len; i--){
                if(str[i] === ' '){
                    res.push(i);
                    if(str[i-1] !== ' '){
                        break;
                    }
                }else{
                    break;
                }
            }
        }
        //将res数组中的
        if(res.length > 0){
            var tmp = '';
            for (var i = 0; i < len; i++){
               if(res.indexOf(i) == -1){
                   tmp += str[i];
               }
            }
            return tmp;
        }else{
            return str;
        }
        return str;
    }

    //通过正则表达式去除字符串收尾的空格
    function regTrim(param) {
        return param.replace(/(^\s*)|(\s*$)/g, "");
    }
    var str = '   ';
    // console.log(simpleTrim(str));
    // console.log(regTrim(str));


    var arr = ['java', 'c', 'php', 'html'];
    function each(arr, fn) {
        for (var i = 0, len = arr.length; i < len; i++){
            fn(i, arr[i]);
        }
    }

    function fn(index, value) {
        console.log(index + ': ' + value)
    }

    var obj = {
        a: 1,
        b: 2,
        c: {
            c1: 3,
            c2: 4
        },
        d:2
    };
    //
    function getObjectFirstLevelLength(obj){
        var res = 0;
        for(var index in obj){
            res++
        }
        return res;
    }
    // console.log(getObjectFirstLevelLength(obj));


    //判断是否是邮箱
    function isEmail(str) {
        var reg = /^[a-z0-9](\w|\.|-)*@([a-z0-9]+-?[a-z0-9]+\.){1,3}[a-z]{2,4}$/i;
        // var reg = /^[a-z0-9A-Z](\w|\.|-){1,3}$/;
        // var reg = /^[a-z0-9A-Z]{1,3}[\w]{1,3}$/;
        // var reg = /^[a-z0-9A-Z]@{2}$/;
        if(reg.test(str)){
            return true;
        }else{
            return false;
        }
    }

    //判断是否是电话（中国）
    function isPhone(str) {
        var reg = /^1[3-578]\d{9}$/;
        if(reg.test(str)){
            return true;
        }else{
            return false;
        }
    }

    var str1 = 'Za0-._@ccc-c.ccc-c.ccc-c.cc';
    // var str1 = 'Z@@@';
    // console.log(isEmail(str1));



    //判断浏览器是否是ie
    function isIE() { //ie?
        if (!!window.ActiveXObject || "ActiveXObject" in window)
            return true;
        else
            return false;
    }
    // console.log(isIE());

    //设置cookie
    function setCookie(c_name, value, expiredays) {
        var exdate=new Date()
        exdate.setDate(exdate.getDate()+expiredays)
        document.cookie=c_name+ "=" +escape(value)+
            ((expiredays==null) ? "" : ";expires="+exdate.toGMTString())
    }

    //得到cookie
    function getCookie(c_name) {
        if (document.cookie.length>0)
        {
            c_start=document.cookie.indexOf(c_name + "=")
            if (c_start!=-1)
            {
                c_start=c_start + c_name.length+1
                c_end=document.cookie.indexOf(";",c_start)
                if (c_end==-1) c_end=document.cookie.length
                return unescape(document.cookie.substring(c_start,c_end))
            }
        }
        return ""
    }

    setCookie('name', 'hmh', 20);
    console.log(getCookie('name'));

</script>
</body>
</html>